﻿Object subclass: #Bando	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP de Objetos'!!Bando methodsFor: 'as yet unclassified' stamp: 'fatIma 11/2/2013 12:51'!teDariaSemilla: unGuerrero^unGuerrero tengoSemillas ! !Object subclass: #SeAcaboLaJoda	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP de Objetos'!"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!SeAcaboLaJoda class	instanceVariableNames: ''!!SeAcaboLaJoda class methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/10/2013 13:28'!excepcion: unMensaje
	"comment stating purpose of message"
	| miError |
miError := Exception new messageText: unMensaje,' - Gugleros'.
miError defaultAction.
miError signal! !!SeAcaboLaJoda class methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/10/2013 13:26'!msjerror: unMensaje
	"comment stating purpose of message"
	| miError |
miError := Error new messageText: unMensaje,' - Gugleros'.
miError signal! !!SeAcaboLaJoda class methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/10/2013 13:07'!warning: unMensaje
	"comment stating purpose of message"
	| miWarning |
miWarning := Warning new messageText: unMensaje,'
Saludos Gugleros!!'.
miWarning signal ! !Bando subclass: #BandoBueno	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP de Objetos'!"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!BandoBueno class	instanceVariableNames: ''!!BandoBueno class methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/10/2013 20:21'!hacerAlgo
SeAcaboLaJoda warning: 'tambien'! !Object subclass: #Guerrero	instanceVariableNames: 'nivel energia vida semillas traje esferas aliados ataques bando nombre resistencia'	classVariableNames: ''	poolDictionaries: ''	category: 'TP de Objetos'!!Guerrero methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/19/2013 20:01'!aliarseA:unGuerrero	^(self puedeAliarseA:unGuerrero)	ifTrue:		[			(unGuerrero puedeAliarseA:self)			ifTrue:				[				self corresponderAlianza:unGuerrero.				unGuerrero corresponderAlianza:self				]			ifFalse: [SeAcaboLaJoda msjerror: 'No se pueden aliar']		]	ifFalse:		[SeAcaboLaJoda msjerror: 'No se pueden aliar']! !!Guerrero methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 11:02'!aprenderPoder: unPoderataques = nil ifTrue: [ ataques := Set new. ].ataques add: unPoder. "Recordar validar si raza puede hacer ataque en la raza!!"! !!Guerrero methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/12/2013 21:06'!aumentarNivel: unaNivel nivel := nivel  + unaNivel  ! !!Guerrero methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/19/2013 10:12'!corresponderAlianza:unGuerrero	self aliados add:unGuerrero! !!Guerrero methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/12/2013 21:40'!decrementarEnergia: unaEnergia energia>unaEnergia 	ifTrue: 	[		energia:= energia - unaEnergia 	]	ifFalse: [ energia:= 0]! !!Guerrero methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/12/2013 21:41'!decrementarVida: unaVida vida>unaVida 	ifTrue: 	[		vida:= vida - unaVida 	]	ifFalse: [ vida:= 0]! !!Guerrero methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/29/2013 22:21'!entregaEsferas	"Chau esferas ='( "		esferas:=Set new.! !!Guerrero methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 11:00'!initialize 
	"Aun no fue testeado"
	vida:= (super class) topeDeVida.	aliados := Set new.	ataques := Set new.	traje:=NoTrajeTraje new.! !!Guerrero methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/29/2013 22:23'!recibeEsfera: unaEsferaesferas = nil ifTrue:[esferas := Set new.].esferas add: unaEsfera! !!Guerrero methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/12/2013 21:51'!recibirAtaque: unaCant A: yoMismo ^traje resistencia: unaCant A: yoMismo ! !!Guerrero methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/12/2013 22:15'!seVisteCon: unTraje traje:=unTraje.! !!Guerrero methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/29/2013 22:14'!transferirEsferasPorMartirio"No valida si realizó un poder vengativo"(self estaMuerto | self estaMoribundo) ifTrue: 	[		 (self aliadosVivos) size > 0 ifTrue:			[	|unAliado|				unAliado:= ((self aliadosVivos) anyOne ).				Esfera traspasoDe: self A: unAliado 			 ]		ifFalse: [ SeAcaboLaJoda msjerror: 'No tengo aliados vivos!! GAME OVER' ]	 ]! !!Guerrero methodsFor: 'Propiedades' stamp: 'Anonymous 10/2/2013 20:54'!aliados
"Me devuelve la lista de aliados.. es una orderd collection"
	^aliados! !!Guerrero methodsFor: 'Propiedades' stamp: 'Anonymous 10/16/2013 20:06'!aliadosMuertos
	"Devuelvo el conjunto de aliados que estan muertos"
	^aliados select: [:aliado | aliado estaMuerto ]

! !!Guerrero methodsFor: 'Propiedades' stamp: 'Anonymous 10/2/2013 20:03'!aliadosVivos
	"Devuelvo el conjunto de aliados que estan vivos"
	^aliados select: [:aliado | aliado estaVivo]

! !!Guerrero methodsFor: 'Propiedades' stamp: 'Anonymous 10/2/2013 21:49'!ataques
	^ataques! !!Guerrero methodsFor: 'Propiedades' stamp: 'Anonymous 10/2/2013 20:54'!bando
	^bando! !!Guerrero methodsFor: 'Propiedades' stamp: 'Anonymous 11/16/2013 11:10'!conoceAtaque: unPoder
	^ataques includes: unPoder.! !!Guerrero methodsFor: 'Propiedades' stamp: 'Anonymous 10/3/2013 18:45'!energia
	^energia! !!Guerrero methodsFor: 'Propiedades' stamp: 'fatIma 10/22/2013 20:58'!energia: unaCantenergia := unaCant ! !!Guerrero methodsFor: 'Propiedades' stamp: 'fatIma 10/21/2013 20:45'!esAliadoDe: unGuerrero^aliados includes: unGuerrero.! !!Guerrero methodsFor: 'Propiedades' stamp: 'Anonymous 10/10/2013 20:52'!esBueno 
bando = nil 
	ifTrue:[SeAcaboLaJoda msjerror:  'No habemus bando']
	ifFalse:[^bando class = BandoBueno ].	
	^'Ehh... Neutral?'! !!Guerrero methodsFor: 'Propiedades' stamp: 'Anonymous 10/29/2013 22:25'!esferas^esferas .! !!Guerrero methodsFor: 'Propiedades' stamp: 'Anonymous 11/16/2013 17:06'!estaMoribundo^((vida > 0) & (vida <= 50)).! !!Guerrero methodsFor: 'Propiedades' stamp: 'Anonymous 10/16/2013 20:03'!estaMuerto	^(self estaVivo) not! !!Guerrero methodsFor: 'Propiedades' stamp: 'Anonymous 10/16/2013 19:58'!estaVivo	^(vida > 0)! !!Guerrero methodsFor: 'Propiedades' stamp: 'fatIma 10/22/2013 21:07'!nivel	^nivel! !!Guerrero methodsFor: 'Propiedades' stamp: 'fatIma 10/22/2013 21:07'!nivel:unNivel	nivel := unNivel.! !!Guerrero methodsFor: 'Propiedades' stamp: 'Anonymous 10/28/2013 21:02'!nombre	^nombre! !!Guerrero methodsFor: 'Propiedades' stamp: 'Anonymous 10/28/2013 21:03'!nombre:unNombre	nombre := unNombre.! !!Guerrero methodsFor: 'Propiedades' stamp: 'Anonymous 10/29/2013 21:09'!puedeComerSemilla

^((self estaMoribundo) | (self energia < 200))! !!Guerrero methodsFor: 'Propiedades' stamp: 'Anonymous 10/2/2013 22:05'!puedePedirSemilla
 aliados anySatisfy: [ :unAliado | unAliado teDariaSemilla ]! !!Guerrero methodsFor: 'Propiedades' stamp: 'Anonymous 11/3/2013 18:06'!puedoTomarEsferas: unEnemigo ^(unEnemigo estaMoribundo | unEnemigo estaMuerto)! !!Guerrero methodsFor: 'Propiedades' stamp: 'fatIma 10/21/2013 21:03'!razaPuedeHacerAtaque: unPoder^true.! !!Guerrero methodsFor: 'Propiedades' stamp: 'fatIma 10/21/2013 21:14'!resistencia ^resistencia.! !!Guerrero methodsFor: 'Propiedades' stamp: 'Anonymous 11/12/2013 21:25'!resistencia:unaResistencia	resistencia := unaResistencia.! !!Guerrero methodsFor: 'Propiedades' stamp: 'fatIma 10/21/2013 21:14'!semillas^semillas ! !!Guerrero methodsFor: 'Propiedades' stamp: 'fatIma 10/28/2013 21:33'!teDariaSemilla
^bando teDariaSemilla: self ! !!Guerrero methodsFor: 'Propiedades' stamp: 'Anonymous 11/2/2013 12:37'!tengoSemillas
 ^semillas>0! !!Guerrero methodsFor: 'Propiedades' stamp: 'Anonymous 11/3/2013 18:11'!tomarEsferas: unEnemigo (self puedoTomarEsferas: unEnemigo ) 	ifTrue: [ Esfera vencedor: self vencido:unEnemigo ]	ifFalse: [ SeAcaboLaJoda warning: 'No puedo tomar esferas, no tiene.' ]! !!Guerrero methodsFor: 'Propiedades' stamp: 'Anonymous 10/2/2013 20:55'!vida
 ^vida! !!Guerrero methodsFor: 'Propiedades' stamp: 'Anonymous 10/29/2013 22:15'!vida: unaCant. vida:=unaCant! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!Guerrero class	instanceVariableNames: 'bando'!!Guerrero class methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/10/2013 22:18'!topeDeVida
 ^1000! !Guerrero subclass: #Monstruo	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP de Objetos'!!Monstruo methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 11:05'!aprenderPoder: unPoder (self razaPuedeHacerAtaque: unPoder) 	ifTrue: [ super aprenderPoder: unPoder  ]	ifFalse: [ SeAcaboLaJoda warning: 'Esta raza no puede hacer este ataque, asi que no vale la pena aprenderlo.' ]! !!Monstruo methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 13:04'!atacarCon: unPoder A: otroGuerrero "No está en Guerrero por que metodos con trabajo interno de raza no estan en Guerrero, se comentan los mismos abajo:"(self esAliadoDe: otroGuerrero) 	ifTrue: [ SeAcaboLaJoda warning: 'No le podes pegar a tus amigos... Y este es tu amigo.' ]	ifFalse: 	[ |puntos|		puntos := self realizarPoder: unPoder. "Metodo con contenido de raza!!"	 	otroGuerrero recibirAtaque: puntos. "Metodo con contenido de raza!!"		self tomarEsferas: otroGuerrero.		(unPoder className = 'PoderVengativo') 			ifTrue: [ self transferirEsferasPorMartirio  ].	]! !!Monstruo methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 17:17'!atacarConElPoderMasPoderosoA: otroGue| etePoder |etePoder := (self ataquesDisponibles asSortedCollection: [ :prev :next| (prev puntosDeAtaqueSinEfecto: self) > (next  puntosDeAtaqueSinEfecto: self)]) first.self atacarCon: etePoder A: otroGue .! !!Monstruo methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 17:26'!atacarConUnPoderQueTengaAlMenos: x A:unOponente|poderPerruno|poderPerruno := (self ataquesDisponibles select: [ :unAtaque | (unAtaque puntosDeAtaqueSinEfecto: self) >= x]) anyOne.self atacarCon: poderPerruno A: unOponente.! !!Monstruo methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 13:18'!atacarConUnPoderQueTengaYPuedaA: otroGue	"1. Filtrar de la lista de poderes [ataques] aquellos que self puedeAtacarCon: 2. variableAuxiliar =: un anyOne de ahi y pasarlo a self atacarCon: variableAuxiliar A: otroGue."	| etePoder |	etePoder := self ataquesDisponibles anyOne.	self atacarCon: etePoder A: otroGue! !!Monstruo methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 16:55'!ataquesDisponibles	^ self ataques select: [ :unPoder | self puedeAtacarCon: unPoder ]! !!Monstruo methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/2/2013 12:20'!cuantosPuntosDeVidaLeQuitaria:puntosDeAtaque^(traje resistenciaSinEfecto:puntosDeAtaque)+20! !!Monstruo methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/12/2013 21:23'!initialize 
	bando := BandoMalo new.	Esfera addGuerreroDelUniverso: self.	super initialize.	super resistencia: 20.
! !!Monstruo methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/19/2013 10:19'!puedeAliarseA:unGuerro	^((self == unGuerro)not)! !!Monstruo methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 11:11'!puedeAtacarCon: unPoder ^(self razaPuedeHacerAtaque: unPoder ) & (unPoder puedeSerRealizadoPor: self) & (self conoceAtaque: unPoder).! !!Monstruo methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 17:05'!realizarPoder: etePoder (self puedeAtacarCon: etePoder)	ifTrue: [^etePoder realizarsePor: self ]	ifFalse: [ SeAcaboLaJoda warning: 'Este Guerrero no puede realizar este poder, por favor intente mas tarde' ]"Esta en cada una de la razas y no en Guerrero porque uso puedeAtacarCon: que es propio de cada raza"! !!Monstruo methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/12/2013 22:13'!recibirAtaque: puntos  |aux|aux:=super recibirAtaque: puntos A: self .aux > self  resistencia 	ifTrue: [ aux := aux - (self  resistencia) ]	ifFalse: [ aux:= 0 ].self decrementarVida: aux  ! !Bando subclass: #BandoMalo	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP de Objetos'!!BandoMalo methodsFor: 'as yet unclassified' stamp: 'fatIma 10/28/2013 21:37'!teDariaSemilla: unGuerrero ^unGuerrero semillas > 1.! !Guerrero subclass: #Saiyajin	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP de Objetos'!!Saiyajin methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 11:06'!aprenderPoder: unPoder (self razaPuedeHacerAtaque: unPoder) 	ifTrue: [ super aprenderPoder: unPoder  ]	ifFalse: [ SeAcaboLaJoda warning: 'Esta raza no puede hacer este ataque, asi que no vale la pena aprenderlo.' ]! !!Saiyajin methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 13:04'!atacarCon: unPoder A: otroGuerrero "No está en Guerrero por que metodos con trabajo interno de raza no estan en Guerrero, se comentan los mismos abajo:"(self esAliadoDe: otroGuerrero) 	ifTrue: [ SeAcaboLaJoda warning: 'No le podes pegar a tus amigos... Y este es tu amigo.' ]	ifFalse: 	[ |puntos|		puntos := self realizarPoder: unPoder. "Metodo con contenido de raza!!"	 	otroGuerrero recibirAtaque: puntos. "Metodo con contenido de raza!!"		self tomarEsferas: otroGuerrero.		(unPoder className = 'PoderVengativo') 			ifTrue: [ self transferirEsferasPorMartirio  ].	]! !!Saiyajin methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 13:46'!atacarConElPoderMasPoderosoA: otroGue|etePoder|etePoder := self ataquesDisponibles asSortedCollection: [ :prev :next| (prev puntosDeAtaqueSinEfecto: self) > (next  puntosDeAtaqueSinEfecto: self)] first.self atacarCon: etePoder A: otroGue .! !!Saiyajin methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 17:26'!atacarConUnPoderQueTengaAlMenos: x A:unOponente|poderPerruno|poderPerruno := (self ataquesDisponibles select: [ :unAtaque | (unAtaque puntosDeAtaqueSinEfecto: self) >= x]) anyOne.self atacarCon: poderPerruno A: unOponente.! !!Saiyajin methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 13:18'!atacarConUnPoderQueTengaYPuedaA: otroGue	"1. Filtrar de la lista de poderes [ataques] aquellos que self puedeAtacarCon: 2. variableAuxiliar =: un anyOne de ahi y pasarlo a self atacarCon: variableAuxiliar A: otroGue."	| etePoder |	etePoder := self ataquesDisponibles anyOne.	self atacarCon: etePoder A: otroGue! !!Saiyajin methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 16:56'!ataquesDisponibles	^ self ataques select: [ :unPoder | self puedeAtacarCon: unPoder ]! !!Saiyajin methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/19/2013 20:00'!cambiarDeBando
	self esBueno
	ifTrue:[bando:=BandoMalo new.]
	ifFalse:[bando:=BandoBueno new.] ! !!Saiyajin methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/2/2013 12:24'!cuantosPuntosDeVidaLeQuitaria:puntosDeAtaque|noResiste|noResiste := (traje resistenciaSinEfecto:puntosDeAtaque).^(noResiste+(noResiste*0,1)+(energia*0,02))! !!Saiyajin methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/29/2013 22:28'!initialize 
	"By default uno es malo hasta que lo conozca"
	bando := BandoMalo new.	Esfera addGuerreroDelUniverso: self.	super initialize.
	! !!Saiyajin methodsFor: 'as yet unclassified' stamp: 'fatIma 10/22/2013 21:07'!puedeAliarseA:unGuerrero	|suma|	^((self == unGuerrero)not)	ifTrue:	[		suma := 0.		(unGuerrero aliadosVivos) do: [:aliado | suma := suma + (aliado nivel) ].		suma := suma + (unGuerrero nivel).		suma < self nivel	]      ifFalse:[false]! !!Saiyajin methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 11:11'!puedeAtacarCon: unPoder ^(self razaPuedeHacerAtaque: unPoder ) & (unPoder puedeSerRealizadoPor: self) & (self conoceAtaque: unPoder).! !!Saiyajin methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 17:03'!realizarPoder: etePoder (self puedeAtacarCon: etePoder)	ifTrue: [ ^etePoder realizarsePor: self ]	ifFalse: [ SeAcaboLaJoda warning: 'Este Guerrero no puede realizar este poder, por favor intente mas tarde' ]"Esta en cada una de la razas y no en Guerrero porque uso puedeAtacarCon: que es propio de cada raza"! !!Saiyajin methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/12/2013 21:51'!recibirAtaque: puntos|aux|aux:=super recibirAtaque: puntos A: self .aux:= (aux * 0.90) - (self energia*0.02) .	self decrementarVida: aux   ! !Guerrero subclass: #Terricola	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP de Objetos'!!Terricola methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 11:06'!aprenderPoder: unPoder (self razaPuedeHacerAtaque: unPoder) 	ifTrue: [ super aprenderPoder: unPoder  ]	ifFalse: [ SeAcaboLaJoda warning: 'Esta raza no puede hacer este ataque, asi que no vale la pena aprenderlo.' ]! !!Terricola methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 17:01'!atacarCon: unPoder A: otroGuerrero "No está en Guerrero por que metodos con trabajo interno de raza no estan en Guerrero, se comentan los mismos abajo:"(self esAliadoDe: otroGuerrero) 	ifTrue: [ SeAcaboLaJoda warning: 'No le podes pegar a tus amigos... Y este es tu amigo.' ]	ifFalse: 	[ |puntos|		puntos := self realizarPoder: (unPoder ). "Metodo con contenido de raza!!"	 	otroGuerrero recibirAtaque: puntos. "Metodo con contenido de raza!!"		self tomarEsferas: otroGuerrero.		(unPoder className = 'PoderVengativo') 			ifTrue: [ self transferirEsferasPorMartirio  ].	]! !!Terricola methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 13:46'!atacarConElPoderMasPoderosoA: otroGue|etePoder|etePoder := self ataquesDisponibles asSortedCollection: [ :prev :next| (prev puntosDeAtaqueSinEfecto: self) > (next  puntosDeAtaqueSinEfecto: self)] first.self atacarCon: etePoder A: otroGue .! !!Terricola methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 17:26'!atacarConUnPoderQueTengaAlMenos: x A:unOponente|poderPerruno|poderPerruno := (self ataquesDisponibles select: [ :unAtaque | (unAtaque puntosDeAtaqueSinEfecto: self) >= x]) anyOne.self atacarCon: poderPerruno A: unOponente.! !!Terricola methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 13:16'!atacarConUnPoderQueTengaYPuedaA: otroGue	"1. Filtrar de la lista de poderes [ataques] aquellos que self puedeAtacarCon: 2. variableAuxiliar =: un anyOne de ahi y pasarlo a self atacarCon: variableAuxiliar A: otroGue."	| etePoder |	etePoder := self ataquesDisponibles anyOne.	self atacarCon: etePoder A: otroGue! !!Terricola methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 16:56'!ataquesDisponibles	^ self ataques select: [ :unPoder | self puedeAtacarCon: unPoder ]! !!Terricola methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/2/2013 12:26'!cuantosPuntosDeVidaLeQuitaria:puntosDeAtaque|noResiste|noResiste := (traje resistenciaSinEfecto:puntosDeAtaque).^(noResiste+(noResiste*0,05))! !!Terricola methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/29/2013 22:28'!initialize 
	bando := BandoBueno new.	Esfera addGuerreroDelUniverso: self.	super initialize.
! !!Terricola methodsFor: 'as yet unclassified' stamp: 'fatIma 10/22/2013 21:07'!puedeAliarseA:unGuerro^((self == unGuerro)not)	ifTrue:	[		(unGuerro esBueno)		ifTrue:		[			(unGuerro nivel  < 15000)			ifTrue: [				(((aliados collect: [:aliado | aliado nivel < 15000 ]) size) <= 5)				] 			ifFalse: [true]		]		ifFalse:[false]	]	ifFalse:[false]! !!Terricola methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 11:09'!puedeAtacarCon: unPoder ^(self razaPuedeHacerAtaque: unPoder ) & (unPoder puedeSerRealizadoPor: self) & (self conoceAtaque: unPoder).! !!Terricola methodsFor: 'as yet unclassified' stamp: 'fatIma 10/22/2013 20:55'!razaPuedeHacerAtaque: unPoder^(unPoder energiaNecesariaSinEfecto < 500). ! !!Terricola methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 17:02'!realizarPoder: etePoder (self puedeAtacarCon: etePoder)	ifTrue: [^etePoder realizarsePor: self ]	ifFalse: [ SeAcaboLaJoda warning: 'Este Guerrero no puede realizar este poder, por favor intente mas tarde' ]"Esta en cada una de la razas y no en Guerrero porque uso puedeAtacarCon: que es propio de cada raza"! !!Terricola methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/12/2013 21:52'!recibirAtaque: puntos|aux|aux:=super recibirAtaque: puntos A: self.aux:= aux * 0.95.	self decrementarVida: aux   ! !Object subclass: #Poder	instanceVariableNames: 'nombrePoder'	classVariableNames: ''	poolDictionaries: ''	category: 'TP de Objetos'!!Poder methodsFor: 'as yet unclassified' stamp: 'fatIma 11/5/2013 20:46'!decrementarEnergia: unGuerrero	unGuerrero decrementarEnergia: (self energiaNecesariaSinEfecto: unGuerrero)! !!Poder methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 11:17'!puedeSerRealizadoPor: unGuerrero ^( self energiaNecesariaSinEfecto: unGuerrero ) <= unGuerrero energia! !Poder subclass: #PoderPotente	instanceVariableNames: 'potencia'	classVariableNames: ''	poolDictionaries: ''	category: 'TP de Objetos'!!PoderPotente methodsFor: 'as yet unclassified' stamp: 'fatIma 10/21/2013 19:52'!energiaNecesariaSinEfecto: unGuerrero^(unGuerrero energia * 0.25).! !!PoderPotente methodsFor: 'as yet unclassified' stamp: 'fatIma 10/21/2013 21:08'!potencia^potencia.! !!PoderPotente methodsFor: 'as yet unclassified' stamp: 'fatIma 10/22/2013 21:01'!potencia: unaCantpotencia := unaCant ! !!PoderPotente methodsFor: 'as yet unclassified' stamp: 'fatIma 10/22/2013 21:24'!puntosDeAtaqueSinEfecto: unGuerrero|auxNivel|auxNivel := (unGuerrero nivel) * potencia .^(auxNivel / 500).  ! !!PoderPotente methodsFor: 'as yet unclassified' stamp: 'fatIma 11/5/2013 21:19'!realizarsePor: unGuerrero"TODO: Decremmmemmmenenenemenetar ener"  (self puedeSerRealizadoPor: unGuerrero) ifTrue: [ self decrementarEnergia: unGuerrero. 	^self puntosDeAtaqueSinEfecto: unGuerrero]  ifFalse: [ SeAcaboLaJoda warning: 'El Guerrero no llega con la energia' ] 		 	! !Poder subclass: #PoderVengativo	instanceVariableNames: 'energiaNecesaria aliadosMuertosMinimos unaCant energiarRequerida'	classVariableNames: 'EnergiaRequerida'	poolDictionaries: ''	category: 'TP de Objetos'!!PoderVengativo methodsFor: 'as yet unclassified' stamp: 'fatIma 10/21/2013 21:09'!aliadosMuertosMinimos^aliadosMuertosMinimos.! !!PoderVengativo methodsFor: 'as yet unclassified' stamp: 'fatIma 10/22/2013 21:29'!aliadosMuertosMinimos: cantMuerto. aliadosMuertosMinimos := cantMuerto! !!PoderVengativo methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 11:17'!energiaNecesariaSinEfecto: unG"TODO: Decrementar energía. Es sin efecto, en que estabas pensando????"^(super class) energiaRequerida ! !!PoderVengativo methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 11:13'!puedeSerRealizadoPor: unGuerrero ^(super puedeSerRealizadoPor: unGuerrero ) & ((unGuerrero aliadosMuertos size ) >= aliadosMuertosMinimos)! !!PoderVengativo methodsFor: 'as yet unclassified' stamp: 'fatIma 11/5/2013 21:26'!puntosDeAtaqueSinEfecto: unGuerrero^(250* (unGuerrero aliadosMuertos size) ).! !!PoderVengativo methodsFor: 'as yet unclassified' stamp: 'fatIma 11/5/2013 21:37'!realizarsePor: unG "TODO: Decrementar energía."(self puedeSerRealizadoPor: unG ) ifTrue: [ self decrementarEnergia: unG. self sacrificaVida: unG.  ^self puntosDeAtaqueSinEfecto: unG. ] ifFalse: [ SeAcaboLaJoda warning: 'El Guerrero no llega con la energia' ] .! !!PoderVengativo methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/16/2013 10:50'!sacrificaVida: unGuerrero |puntos| puntos:=(self puntosDeAtaqueSinEfecto: unGuerrero).puntos:= puntos/5. "20% = x/5"unGuerrero decrementarVida: puntos.! !"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!PoderVengativo class	instanceVariableNames: ''!!PoderVengativo class methodsFor: 'as yet unclassified' stamp: 'fatIma 10/22/2013 21:45'!energiaRequerida^EnergiaRequerida! !!PoderVengativo class methodsFor: 'as yet unclassified' stamp: 'fatIma 10/22/2013 21:46'!energiaRequerida: unaCant EnergiaRequerida := unaCant ! !Poder subclass: #PoderColectivo	instanceVariableNames: 'aliadosVivosMinimos energiaMinimaDeAliados cantidadDePuntosSacados'	classVariableNames: ''	poolDictionaries: ''	category: 'TP de Objetos'!!PoderColectivo methodsFor: 'as yet unclassified' stamp: 'fatIma 11/3/2013 18:00'!aliadosConEnergiaSuficienteDe: unGuerrero	^ (unGuerrero aliadosVivos) select: [ :unAliadoVivo| unAliadoVivo energia >= energiaMinimaDeAliados] ! !!PoderColectivo methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/28/2013 22:46'!aliadosVivosMinimos^aliadosVivosMinimos! !!PoderColectivo methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/28/2013 22:46'!aliadosVivosMinimos: estosaliadosVivosMinimos:= estos.! !!PoderColectivo methodsFor: 'as yet unclassified' stamp: 'fatIma 11/5/2013 20:46'!decrementarEnergiaColectivaA: unGuerrero yAliados: auxAliados	auxAliados do: [ :auxAliado | auxAliado decrementarEnergia: self energiaMinimaDeAliados ].	self decrementarEnergia: unGuerrero! !!PoderColectivo methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/28/2013 22:45'!energiaMinimaDeAliados^energiaMinimaDeAliados.! !!PoderColectivo methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/28/2013 22:45'!energiaMinimaDeAliados: tantoenergiaMinimaDeAliados := tanto.! !!PoderColectivo methodsFor: 'as yet unclassified' stamp: 'fatIma 10/21/2013 20:02'!energiaNecesariaSinEfecto: unGuerrero^200.! !!PoderColectivo methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/3/2013 20:20'!puedeSerRealizadoPor: unGuerrero	^ ((super puedeSerRealizadoPor: unGuerrero) & ((self aliadosConEnergiaSuficienteDe: unGuerrero) size >= self aliadosVivosMinimos)) ! !!PoderColectivo methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/3/2013 20:42'!puntosDeAtaqueDe: unGuerrero yAliados: auxAliados	^ ((auxAliados size * (self energiaMinimaDeAliados)) + (self energiaNecesariaSinEfecto: unGuerrero))! !!PoderColectivo methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/3/2013 20:40'!puntosDeAtaqueSinEfecto: unGuerrero	| auxAliados |	auxAliados := self aliadosConEnergiaSuficienteDe: unGuerrero.	((self puedeSerRealizadoPor: unGuerrero) & (auxAliados size >= self aliadosVivosMinimos))		ifTrue: [ ^ self puntosDeAtaqueDe: unGuerrero yAliados: auxAliados ]		ifFalse: [ SeAcaboLaJoda warning:'Alguien (o yo o mis aliados necesarios) no llega con la energia para darme una mano.' ]! !!PoderColectivo methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/3/2013 20:37'!realizarsePor: unGuerrero	| auxAliados |	auxAliados := self aliadosConEnergiaSuficienteDe: unGuerrero.	(self puedeSerRealizadoPor: unGuerrero) & (auxAliados size >= self aliadosVivosMinimos)		ifTrue: [ 			self decrementarEnergiaColectivaA: unGuerrero yAliados: auxAliados.			^ self puntosDeAtaqueDe: unGuerrero yAliados: auxAliados ]		ifFalse: [ SeAcaboLaJoda warning: 'Alguien (o yo o mis aliados necesarios) no llega con la energia' ]! !Poder subclass: #PoderLiviano	instanceVariableNames: 'puntosDeAtaque energiaMinima'	classVariableNames: ''	poolDictionaries: ''	category: 'TP de Objetos'!!PoderLiviano methodsFor: 'as yet unclassified' stamp: 'fatIma 11/5/2013 20:50'!decrementarEnergia: unGuerrero	"no hago nada xq soy rebelde"! !!PoderLiviano methodsFor: 'as yet unclassified' stamp: 'fatIma 11/5/2013 21:04'!energiaNecesariaSinEfecto^50.! !!PoderLiviano methodsFor: 'as yet unclassified' stamp: 'fatIma 11/5/2013 21:03'!puntosDeAtaque^puntosDeAtaque.! !!PoderLiviano methodsFor: 'as yet unclassified' stamp: 'fatIma 11/5/2013 21:02'!puntosDeAtaque:  unaCantpuntosDeAtaque := unaCant! !!PoderLiviano methodsFor: 'as yet unclassified' stamp: 'fatIma 11/5/2013 21:04'!puntosDeAtaqueSinEfecto: unGuerrero^puntosDeAtaque .! !!PoderLiviano methodsFor: 'as yet unclassified' stamp: 'fatIma 11/5/2013 21:11'!realizarsePor: unGuerrero (self puedeSerRealizadoPor: unGuerrero) ifTrue: [ ^self puntosDeAtaque. ] ifFalse: [ SeAcaboLaJoda warning: 'El Guerrero no llega con la energia' ]  ! !Object subclass: #Traje	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP de Objetos'!!Traje methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/12/2013 20:53'!resistencia: puntosDeAtaque A: unGuerrero ^ self resistenciaSinEfecto: puntosDeAtaque. ! !!Traje methodsFor: 'as yet unclassified' stamp: 'fatima 10/28/2013 20:10'!resistenciaSinEfecto: puntosDeAtaque^0.9 * puntosDeAtaque. ! !Traje subclass: #TrajeEntrenamiento	instanceVariableNames: 'conteoAtaques'	classVariableNames: ''	poolDictionaries: ''	category: 'TP de Objetos'!!TrajeEntrenamiento methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/12/2013 20:58'!initialize conteoAtaques:= 0.! !!TrajeEntrenamiento methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/12/2013 21:10'!resistencia: puntosDeAtaque A: unGuerrero unGuerrero decrementarEnergia: 20.conteoAtaques:= conteoAtaques  + 1.conteoAtaques == 3 ifTrue: 	[ 		unGuerrero aumentarNivel: 100. 		conteoAtaques:= 0. 	]. ^ self resistenciaSinEfecto: puntosDeAtaque. ! !Traje subclass: #TrajeEspecial	instanceVariableNames: 'resistenciaFija'	classVariableNames: ''	poolDictionaries: ''	category: 'TP de Objetos'!!TrajeEspecial methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/12/2013 20:54'!resistencia: puntosDeAtaque A: unGuerrero ^ self resistenciaSinEfecto: puntosDeAtaque. ! !!TrajeEspecial methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/12/2013 22:25'!resistenciaSinEfecto: puntosDeAtaque|aux|aux:=(super resistenciaSinEfecto: puntosDeAtaque ).aux>20 	ifTrue:[^(aux-20)]	ifFalse:[^0]! !Traje subclass: #NoTrajeTraje	instanceVariableNames: ''	classVariableNames: ''	poolDictionaries: ''	category: 'TP de Objetos'!!NoTrajeTraje methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/12/2013 20:54'!resistencia: puntosDeAtaque A: unGuerrero ^ self resistenciaSinEfecto: puntosDeAtaque. ! !!NoTrajeTraje methodsFor: 'as yet unclassified' stamp: 'Anonymous 11/12/2013 20:41'!resistenciaSinEfecto: puntosDeAtaque^puntosDeAtaque! !Object subclass: #Esfera	instanceVariableNames: ''	classVariableNames: 'GuerrerosDelUniverso Poseedores'	poolDictionaries: ''	category: 'TP de Objetos'!"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!Esfera class	instanceVariableNames: ''!!Esfera class methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/22/2013 16:20'!aCadaUnoDe: unaCol leDoyUnaEsferaLibreDe: poseedoresAux	unaCol		do: [ :auxGue | 			(poseedoresAux indexOf: nil) ~= 0				ifTrue: [ self nuevoPoseedor: auxGue enListado: poseedoresAux ] ]! !!Esfera class methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/21/2013 20:01'!addGuerreroDelUniverso: unGuerreroGuerrerosDelUniverso = nil ifTrue: [ GuerrerosDelUniverso := Set new. ].GuerrerosDelUniverso add: unGuerrero.! !!Esfera class methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/22/2013 16:18'!esferasRestantesSinEfectoSonPara: unGue enListado: poseedoresAux	[ (poseedoresAux indexOf: nil) ~= 0 ] whileTrue: [ self nuevoPoseedor: unGue enListado: poseedoresAux ]! !!Esfera class methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/21/2013 19:59'!guerrerosDelUniverso^GuerrerosDelUniverso ! !!Esfera class methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/21/2013 19:43'!initialize	"Inicializar variable de clase"	Poseedores := Array new: 7.	GuerrerosDelUniverso  := Set new.	! !!Esfera class methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/21/2013 22:06'!initializeRepartija"A las esferas sin dueÒo le damos dueÒo"|unGuerrerin| "Un guerrerin, que se mueve por aqui, que se mueve por all·, todo pegoteado, con un poco de aceite, con un poco de sal, xD"[1 to: 7 do: 	[:ind| (Poseedores at: ind) = nil 		ifTrue:		[			unGuerrerin := GuerrerosDelUniverso anyOne.			unGuerrerin = nil 			ifTrue:			[				SeAcaboLaJoda msjerror: 'No hay Guerreros en el Universo!!'			]			ifFalse:			[				Poseedores at: ind put: unGuerrerin.				unGuerrerin recibeEsfera: ind.				].		].	].] on: Error do: [ SeAcaboLaJoda warning: 'No inicializar la repartija: No hay guerreros en el Universo' ].! !!Esfera class methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/28/2013 20:46'!lasTieneElEquipoDe: unGue ^Poseedores allSatisfy: [: otroGue| ((unGue esAliadoDe: otroGue) | (unGue=otroGue ))]! !!Esfera class methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/21/2013 22:27'!limpiarGuerrerosDelUniversoself limpiarPoseedores .GuerrerosDelUniverso  := Set new.! !!Esfera class methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/22/2013 15:54'!limpiarPoseedoresPoseedores do:[:elem| 	(elem notNil) ifTrue: [elem entregaEsferas]	].Poseedores := Array new: 7.! !!Esfera class methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/22/2013 16:15'!nuevoPoseedor: auxGue enListado: poseedoresAux	^ poseedoresAux at: (poseedoresAux indexOf: nil) put: auxGue! !!Esfera class methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/28/2013 20:46'!ordenoAliadosEnemigos: unGue	^ (GuerrerosDelUniverso select: [ :auxGue | unGue esAliadoDe: auxGue ])  asOrderedCollection 		, (GuerrerosDelUniverso select: [ :auxGue | ((unGue esAliadoDe: auxGue) not & (unGue ~= auxGue)) ])				 asOrderedCollection ! !!Esfera class methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/21/2013 21:40'!poseedoresPoseedores = nil ifTrue: [Poseedores := Array new: 7.].^Poseedores.! !!Esfera class methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/22/2013 16:03'!repartijaDeEsferasSiQuienLlamoEs:  unGue "? Si tiene 7 o más aliados vivos, le da cada una a 7 aliados cualquiera (no importa a cuales, ni tiene porqué ser aleatorio).● En caso contrario, y si tiene suficientes enemigos (guerreros que haya atacado) vivos, reparte las que puede entre sus aliados vivos, y el resto entre enemigos vivos cualquiera.● Si aún así sigue sin haber esferas sin repartir, estas quedan en manos del guerrero que las tiene actualmente."self limpiarPoseedores."Le doy al ente superior conocimiento de quien tiene las esferas unicas"Poseedores := self repartijaDeEsferasSinEfectoSiQuienLlamoEs:  unGue."Se las doy efectivamente a cada guerrero segun corresponda"1 to: 7 do: [:ind| (Poseedores at: ind) recibeEsfera: ind].! !!Esfera class methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/22/2013 16:20'!repartijaDeEsferasSinEfectoSiQuienLlamoEs: unGue	"? Si tiene 7 o más aliados vivos, le da cada una a 7 aliados cualquiera (no importa a cuales, ni tiene porqué ser aleatorio).● En caso contrario, y si tiene suficientes enemigos (guerreros que haya atacado) vivos, reparte las que puede entre sus aliados vivos, y el resto entre enemigos vivos cualquiera.● Si aún así sigue sin haber esferas sin repartir, estas quedan en manos del guerrero que las tiene actualmente."	| unaCol poseedoresAux |	poseedoresAux := Array new: 7.	"Ordeno: Aliados, Enemigos"	unaCol := self ordenoAliadosEnemigos: unGue.	"Le 'doy' (sin efecto) una esfera a cada"	self aCadaUnoDe: unaCol leDoyUnaEsferaLibreDe: poseedoresAux.	"unGue se queda con las restantes"	self esferasRestantesSinEfectoSonPara: unGue enListado: poseedoresAux.	^ poseedoresAux! !!Esfera class methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/21/2013 20:59'!traspasoDe: unGue A: otroGue "Funciona Igual que vencedor vencido, solo que el traspaso se hace entre aliados.Dado que vencedor vencido no deberÌa validar si son o no aliados (eso lo hace el guerrero) esto deberÌa funcionar."self vencedor: otroGue  vencido: unGue.! !!Esfera class methodsFor: 'as yet unclassified' stamp: 'Anonymous 10/22/2013 13:01'!vencedor: unGuerrero vencido: otroGuerrero"Le pasa las esferas de otroGuerrero a unGuerrero si es que el primero tenÌa esferas. No se encarga de validar si este pasaje es correcto"|index|otroGuerrero entregaEsferas.[Poseedores includes: otroGuerrero] whileTrue: [ 	index := (Poseedores indexOf: otroGuerrero). 	Poseedores at: index put: unGuerrero. 	unGuerrero recibeEsfera: index.	]! !Esfera initialize!